package model

import (
	"errors"
	"time"

	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"
)

// User 用户模型
// 仅存储登录认证信息
type User struct {
	ID        uint           `gorm:"primarykey" json:"id"` // 主键ID
	CreatedAt time.Time      `json:"created_at"`           // 创建时间
	UpdatedAt time.Time      `json:"updated_at"`           // 更新时间
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`       // 软删除时间

	Username string `gorm:"size:50;not null;unique" json:"username"` // 用户名，最大长度50，唯一
	Password string `gorm:"size:100;not null" json:"-"`              // 密码，加密存储，不返回给前端
	Email    string `gorm:"size:100;not null;unique" json:"email"`   // 邮箱地址，最大长度100，唯一
	Phone    string `gorm:"size:20" json:"phone"`                    // 电话号码，最大长度20
	Status   int    `gorm:"default:1" json:"status"`                 // 状态: 1-正常, 0-禁用
	Roles    []Role `gorm:"many2many:user_roles;" json:"roles"`      // 用户角色关联，多对多关系
}

// SetPassword 设置密码
func (u *User) SetPassword(password string) error {
	if len(password) == 0 {
		return errors.New("密码不能为空")
	}

	hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return err
	}

	u.Password = string(hash)
	return nil
}

// CheckPassword 验证密码
func (u *User) CheckPassword(password string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
	return err == nil
}
